cordova.define("org.apache.cordova.device.device", function (require, exports, module) {/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 */

	var argscheck = require('cordova/argscheck'),
		channel = require('cordova/channel'),
		utils = require('cordova/utils'),
		exec = require('cordova/exec'),
		cordova = require('cordova'),
		camera = require('org.apache.cordova.camera.Camera');

	channel.createSticky('onCordovaInfoReady');
// Tell cordova channel to wait on the CordovaInfoReady event
	channel.waitForInitialization('onCordovaInfoReady');

	/**
	 * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the
	 * phone, etc.
	 * @constructor
	 */
	function Device() {
		this.available = false;
		this.platform = null;
		this.version = null;
		this.uuid = null;
		this.cordova = null;
		this.model = null;

		var me = this;

		channel.onCordovaReady.subscribe(function () {
			me.getInfo(function (info) {
				//ignoring info.cordova returning from native, we should use value from cordova.version defined in cordova.js
				//TODO: CB-5105 native implementations should not return info.cordova
				var buildLabel = cordova.version;
				me.available = true;
				me.deviceType = info.deviceType;
				me.platform = info.platform;
				me.version = info.version;
				me.uuid = info.uuid;
				me.cordova = buildLabel;
				me.model = info.model;
				me.appShell = info.appShell;
				me.platformVersion = info.platformVersion;
				channel.onCordovaInfoReady.fire();
			}, function (e) {
				me.available = false;
				utils.alert("[ERROR] Error initializing Cordova: " + e);
			});
		});
	}

	/**
	 * Get device info
	 *
	 * @param {Function} successCallback The function to call when the heading data is available
	 * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL)
	 */
	Device.prototype.getInfo = function (successCallback, errorCallback) {
		argscheck.checkArgs('fF', 'Device.getInfo', arguments);
		exec(successCallback, errorCallback, "Device", "getDeviceInfo", []);
	};
	Device.prototype.getDeviceInfo = function () {
		var me = this;
		var info =
		{
			hardware: me.model,
			deviceType: me.deviceType,
			deviceId: me.uuid,
			platform: me.platform,
			platformVersion: me.version,
			os: 'iOS',
			appShell: me.appShell,
			platformVersion: me.platformVersion


		}
		return info;
	};
	Device.prototype.setAppInstalled = function (version) {
		exec(null, null, "Device", "setAppInstalled", [version]);
	};
	Device.prototype.fullScreen = function (enable) {
		exec(null, null, "Device", enable ? "enableFullScreen" : "disableFullScreen", []);
	};

	Device.prototype.isOnline = function () {
		return navigator.onLine;
	};
	Device.prototype.openSystemBrowser = function (url) {
		exec(null, null, "Device", "openSystemBrowser", [url]);

	};

	Device.prototype.takePicture = function (src, des, cb) {
		var opt = {};

		if (src == 'lib')
			opt.sourceType = Camera.PictureSourceType.PHOTOLIBRARY;

		if (des == 'base64')
			opt.destinationType = Camera.DestinationType.DATA_URL;


		navigator.camera.getPicture(function (data) {
			cb(undefined, des, data);
		}, function (error) {
			cb({msg: error});
		}, opt);

	};
               
    Device.prototype.enableIdleSleep = function() {
        exec(null, null, "Device","enableIdleSleep", []);
    };
               
    Device.prototype.disableIdleSleep = function() {
        exec(null, null, "Device","disableIdleSleep", []);
    };

 Device.prototype.kdsCallback = function (err, msgId, data) {
        exec(null, null, "Device", "kdsCallback", [err, msgId, data]);
    };


	module.exports = new Device();
});
